package com.tang.plugin.model;

import com.tang.plugin.template.RouteTemplate;
import com.tang.plugin.template.Template;

import java.io.Serializable;
import java.util.Objects;

public class Module implements Serializable {

    private FileTreeNode template;
    private String name;

    public Module(FileTreeNode template, String name) {
        this.template = template;
        this.name = name;
    }

    public void initTemplate() {
        initTemplate(template);
    }

    public void initTemplate(FileTreeNode node) {
        if (node != null) {
            node.getChildren().forEach((item) -> {
                item.parent = node;
                if (item.isDir()) {
                    initTemplate(item);
                }
            });
        }
    }

    private static Module create(FileTreeNode template, String templateName) {
        return new Module(template, templateName);
    }

    public static Module createRouteModule() {
        return create(RouteTemplate.MODULE.copy(), "Route Module");
    }

    public static Module createEmpty() {
        return create(Template.EMPTY.copy(), "Empty Module");
    }

    public Module copyModule() {
        return create(template.copy(), name);
    }

    public FileTreeNode getTemplate() {
        return template;
    }

    public void setTemplate(FileTreeNode template) {
        this.template = template;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Module module = (Module) o;
        return Objects.equals(template, module.template) && Objects.equals(name, module.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(template, name);
    }
}
